package com.hinnotek.amoeba.ui.activity.old

import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
import com.chad.library.adapter.base.BaseQuickAdapter
import com.lee.common.base.BaseActivity
import com.hinnotek.amoeba.R
import com.hinnotek.amoeba.adapters.old.LaborCostListAdapter
import com.hinnotek.amoeba.bean.old.CompanyPersonCostPageBean
import com.hinnotek.amoeba.databinding.ActivityLaborCostListBinding
import com.hinnotek.amoeba.dialog.CustomDialog
import com.hinnotek.amoeba.ext.init
import com.hinnotek.amoeba.utilities.IntentUtils
import com.hinnotek.amoeba.utilities.StatusBarUtil
import com.hinnotek.amoeba.utilities.ToastUtils
import com.hinnotek.amoeba.viewmodels.PersonViewModel
import com.lee.common.network.net.ObserverState
import com.scwang.smart.refresh.layout.api.RefreshLayout
import dagger.hilt.android.AndroidEntryPoint

/**
 * "人工成本列表"Activity页
 */
@AndroidEntryPoint
class LaborCostListActivity : BaseActivity<ActivityLaborCostListBinding>() {

    private val viewModel by viewModels<PersonViewModel>()

    private lateinit var mAdapter: LaborCostListAdapter
    private var customDialog: CustomDialog? = null
    private var pageNo = 1
    private val pageSize = 20

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setLeftVisible(true)
        setTitle("人工成本")

        setContentView(R.layout.activity_labor_cost_list)
    }

    override fun initVew() {
        StatusBarUtil.setStatusBarColor(this, R.color.colorbtns)
        bindingView.superButtonAddBtn.text = "添加"
        bindingView.recyclerView.init()
        bindingView.recyclerView.adapter = LaborCostListAdapter().also { mAdapter = it }
        mAdapter.setOnItemClickListener { adapter: BaseQuickAdapter<*, *>, view: View?, position: Int ->
            val data = adapter.getItem(position) as CompanyPersonCostPageBean
            val bundle = Bundle()
            bundle.putInt("companyPersonCostId", data.companyPersonCostId)
            IntentUtils.startActivity(mContext, LaborCostDetailActivity::class.java, bundle)
        }
        //跳转到"提交人工成本"Activity页
        bindingView.superButtonAddBtn.setOnClickListener { v: View? ->
            IntentUtils.startActivity(
                mContext,
                LaborCostActivity::class.java
            )
        }
    }

    override fun setData() {
        //下拉刷新
        bindingView.refreshLayout.setOnRefreshListener { refreshLayout: RefreshLayout ->
            refreshLayout.layout.postDelayed(
                {
                    pageNo = 1
                    getCompanyPersonCostPage()
                    refreshLayout.finishRefresh()
                }, 0
            )
        }
        //上拉加载
        bindingView.refreshLayout.setOnLoadMoreListener { refreshLayout: RefreshLayout ->
            refreshLayout.layout.postDelayed(
                {
                    pageNo++
                    getCompanyPersonCostPage()
                    refreshLayout.finishLoadMore()
                }, 0
            )
        }
    }

    override fun onResume() {
        super.onResume()
        bindingView.refreshLayout.autoRefresh() //第一次进入触发自动刷新，演示效果
    }//将不会再次触发加载更多事件//setNoMoreData(false);

    /**
     * app端获取全部成本记录分页接口
     */
    private fun getCompanyPersonCostPage() {
        customDialog = CustomDialog(mContext, "正在加载...")
        customDialog?.show()

        viewModel.getCompanyPersonCostPage(pageNo, pageSize)
            .observe(this, object : ObserverState<MutableList<CompanyPersonCostPageBean>>() {
                override fun onDataChange(data: MutableList<CompanyPersonCostPageBean>) {
                    if (pageNo == 1) {
                        when (getRefreshStatus(data.size)) {
                            Status.SUCCESS -> {
                                mAdapter.setList(data)
                                if (data.size < pageSize) {
                                    bindingView.refreshLayout.setEnableLoadMore(false)
                                } else {
                                    bindingView.refreshLayout.setEnableLoadMore(true)
                                }
                                bindingView.refreshLayout.resetNoMoreData() //setNoMoreData(false);
                                bindingView.llStateful.showContent()
                            }
                            Status.EMPTY -> {
                                bindingView.llStateful.showEmpty()
                                bindingView.refreshLayout.setEnableLoadMore(false)
                            }
                            Status.ERROR -> showError()
                            Status.NO_NET -> showOffline()
                            else -> {
                                showOffline()
                            }
                        }
                        bindingView.refreshLayout.finishRefresh()
                    } else {
                        if (data.size == 0) {
                            ToastUtils.showShort("数据全部加载完毕")
                            bindingView.refreshLayout.finishLoadMoreWithNoMoreData() //将不会再次触发加载更多事件
                        } else {
                            mAdapter.addData(data.toMutableList())
                            bindingView.refreshLayout.finishLoadMore()
                        }
                    }
                    super.onDataChange(data)
                }

                override fun onError(msg: String?, code: Int) {
                    customDialog?.dismiss()
                    ToastUtils.showShort(mContext, msg)
                    super.onError(msg, code)
                }
            })
    }

    private fun showOffline() {
        bindingView.llStateful.showOffline(View.OnClickListener { bindingView.refreshLayout.autoRefresh() })
        bindingView.refreshLayout.setEnableLoadMore(false)
    }

    private fun showError() {
        bindingView.llStateful.showError(View.OnClickListener { bindingView.refreshLayout.autoRefresh() })
        bindingView.refreshLayout.setEnableLoadMore(false)
    }

    private enum class Status {
        SUCCESS, EMPTY, ERROR, NO_NET
    }

    private fun getRefreshStatus(size: Int): Status {
        return if (size == 0) {
            Status.EMPTY
        } else {
            Status.SUCCESS
        }
    }

}